# -*- coding:utf8 -*-
"""
汉字处理的工具:
判断unicode是否是汉字，数字，英文，或者其他字符。
全角符号转半角符号。
"""
from __future__ import print_function, unicode_literals
import sys
if sys.version_info.major == 3:
    unichr = chr


def most_pre_same(str_a, str_b):
    """
    前缀一样的最大
    """
    if not str_a or not str_b:
        return ''

    for sn, (i, j) in enumerate(zip(str_a, str_b)):
        if not i == j:
            return str_a[:sn]
    return str_a[:sn + 1]


def is_chinese(uchar):
    """判断一个unicode是否是汉字"""
    if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
        return True
    else:
        return False


def has_chinese(string):
    """
    是否含有中文字符
    """
    for uchar in string:
        if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
            return True
    return False


def has_alphabet(string):
    """判断一个unicode是否是英文字母"""
    for uchar in string:
        if (uchar >= u'\u0041' and uchar <= u'\u005a') or (
                uchar >= u'\u0061' and uchar <= u'\u007a'):
            return True
    return False


def has_number(string):
    """判断一个unicode是否是数字"""
    for uchar in string:
        if uchar >= u'\u0030' and uchar <= u'\u0039':
            return True
    return False


def is_number(uchar):
    """判断一个unicode是否是数字"""
    if uchar >= u'\u0030' and uchar <= u'\u0039':
        return True
    else:
        return False


def is_alphabet(uchar):
    """判断一个unicode是否是英文字母"""
    if (uchar >= u'\u0041' and uchar <= u'\u005a') or (
            uchar >= u'\u0061' and uchar <= u'\u007a'):
        return True
    else:
        return False


def is_alphanumber(uchar):
    """为数字或则字母"""
    return is_number(uchar) or is_alphabet(uchar)


def is_other(uchar):
    """判断是否非汉字，数字和英文字符"""
    if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
        return True
    else:
        return False


def B2Q(uchar):
    """半角转全角"""
    inside_code = ord(uchar)
    if inside_code < 0x0020 or inside_code > 0x7e:  # 不是半角字符就返回原来的字符
        return uchar
    if inside_code == 0x0020:  # 除了空格其他的全角半角的公式为:半角=全角-0xfee0
        inside_code = 0x3000
    else:
        inside_code += 0xfee0
    return unichr(inside_code)


def Q2B(uchar):
    """全角转半角"""
    inside_code = ord(uchar)
    if inside_code == 0x3000:
        inside_code = 0x0020
    else:
        inside_code -= 0xfee0
    if inside_code < 0x0020 or inside_code > 0x7e:  # 转完之后不是半角字符返回原来的字符
        return uchar
    return unichr(inside_code)


def stringQ2B(ustring):
    """把字符串全角转半角"""
    return "".join([Q2B(uchar) for uchar in ustring])


def uniform(ustring):
    """格式化字符串，完成全角转半角，大写转小写的工作"""
    return stringQ2B(ustring).lower()


def string2List(ustring):
    """将ustring按照中文，字母，数字分开"""
    retList = []
    utmp = []
    for uchar in ustring:
        if is_other(uchar):
            if len(utmp) == 0:
                continue
            else:
                retList.append("".join(utmp))
                utmp = []
        else:
            utmp.append(uchar)
    if len(utmp) != 0:
        retList.append("".join(utmp))
    return retList
